ダウンタイムなしでインターフェイス型VPCエンドポイントのサブネットを変更する方法を調べてみた
こんにちは!AWS事業本部のおつまみです。
みなさん、インターフェイス型VPCエンドポイントのサブネットを変更したいと思ったことはありますか?私はあります。
サブネットに紐づいているルートテーブルの関係で作成済みのインターフェイス型VPCエンドポイントサブネットを変更する必要がありました。
いざ、サブネットを変更!と思いましたが、私の中のリトルおつまみがこう囁いてくれました。
「インターフェイス型VPCエンドポイントの実態はElastic Network Interface(ENI)よ。サブネットを変更するってことはENIが再作成されるからダウンタイムが発生するんじゃないの...?」
ここで私は思いとどまって、インターフェイス型VPCエンドポイントのサブネットを変更した場合にダウンタイムが発生するか調査してみました。
いきなり結論
- サブネットを変更する場合、ENIが変更になるためダウンタイムが発生する。
- 同じエンドポイントサービスの場合、プライベートDNSを有効化したインターフェイス型VPCエンドポイントはAZごとに1つしか設定できない。
- インターフェイス型VPCエンドポイントはVPCの中に1つあれば通信できる。
この情報を元にダウンタイムなしでサブネットを変更する方法は以下の通りです。
ダウンタイムなしでサブネットを変更する方法
- シングルAZの場合
- 現時点で作成されているサブネットと別AZのサブネットにエンドポイントを作成する。
- 現時点で作成されているAZのサブネットを変更したいサブネットに変更する。
- 手順1で作成したエンドポイントのサブネットを削除する。
- マルチAZの場合
- 現時点で作成されているサブネットのどちらか一方のサブネットを片方のみ変更する。
- 変更していない方のサブネットを変更する。
検証前に結論について解説します。
事前知識
サブネット変更によるダウンタイム
インターフェイス型VPCエンドポイントはサブネットを変更する際にダウンタイムが発生します。
理由はサブネット変更により、ENIの置換が行われるためです。
実際にサブネットを変更する場合の挙動についてマネジメントコンソールで確認してみましょう。
同じプライベートサブネットにエンドポイント接続用のEC2及びAmazon SES用のエンドポイントcom.amazonaws.ap-northeast-1.email-smtp
を1つ作成します。
- EC2インスタンス
- VPCエンドポイント
SESは既に作成してある状態です。
現時点でこのような構成になっています。
この状態だと、EC2インスタンスからSES用のVPCエンドポイントに問題なく接続できます。
参考:コマンドラインを使用して、Amazon SES SMTP インターフェイスへの接続をテストする - Amazon Simple Email Service
さて、ここで下記のようにサブネットの変更をしてみます。
[サブネットを管理]を選択します。
同じAZの別サブネットを選択し、[変更]を選択します。
すると、変更したサブネットでENIが1つ作成され始めました。
この状態で先ほどと同様にEC2からSES用のエンドポイントへの接続を試してみます。 すると、接続ができません。
そのまま2分ほど経過すると、Connection timed out
が発生しました。
よって、インターフェイス型VPCエンドポイントはサブネットを変更する際にダウンタイムが発生することがわかりました。
同じエンドポイントサービスの場合、プライベートDNSを有効化したインターフェイス型VPCエンドポイントはAZごとに1つしか設定できない。
同じエンドポイントサービスの場合、プライベートDNSを有効化したインターフェイス型VPCエンドポイントはAZごとに1つしか設定できません。
試しに同じエンドポイントサービスを同じAZで作成しようとします。
すると下記のようにエラーが発生しました。
エラーメッセージは以下の通りです。
VPC vpc-02ed24ac4a03d97da に email-smtp.ap-northeast-1.amazonaws.com の競合する DNS ドメインがすでに存在するため、private-dns-enabled を設定できません
すでに同じVPC内で同じエンドポイントサービスに対してプライベートDNSが有効化されているために発生するエラーです。
よって同じエンドポイントサービスの場合、DNS ドメインが重複してしまうためインターフェイス型VPCエンドポイントはAZごとに1つしか設定できないことがわかります。
インターフェイス型VPCエンドポイントはVPCの中に1つあれば通信できる
インターフェイス型VPCエンドポイントはVPCの中に1つあれば通信できます。
「あれ?同じAZじゃなくても通信できるの?」
と思ってしまいがちですが、別のAZにあっても通信可能です。
理由は、サブネットのルートテーブルにlocalへのターゲットがあるためです。これにより、別AZのVPCエンドポインに紐づいているENIへも接続ができます。
公式ドキュメントの図の通りですね。
参考:AWS PrivateLink 経由で AWS のサービス にアクセスする - Amazon Virtual Private Cloud
よって、インターフェイス型VPCエンドポイントはVPCの中に1つあれば通信できることがわかります。
以上が事前知識でした。
ここまでを踏まえて、VPCエンドポイントがシングルAZ・マルチAZで配置されている場合を想定し、ダウンタイムなしでサブネットを変更してみようと思います。
やってみた
シングルAZの場合
大まかな流れは以下のとおりです。
- 現時点で作成されているサブネットと別AZのサブネットにエンドポイントを作成する。
-
現時点で作成されているAZのサブネットを変更したいサブネットに変更する。
-
手順1で作成したエンドポイントのサブネットを削除する。
完成図
今回はマネジメントコンソールでの変更手順をご紹介します。
現時点で作成されているサブネットと別AZのサブネットにエンドポイントを作成する。
まずは、現時点で作成されているサブネットと別AZのサブネットにエンドポイントを作成します。
[サブネットの管理]を選択します。
現時点で作成されているサブネットと別AZのサブネットを選択し、[サブネットの変更]を選択します。
別AZのサブネットでVPCエンドポイントが作成されます。
現時点で作成されているAZのサブネットを変更したいサブネットに変更する。
次に、現時点で作成されているAZのサブネットを変更したいサブネットに変更します。 元のVPCエンドポイントが作成されていたサブネットをを変更したいサブネットに変更し、[サブネットの変更]を選択します。
サブネットが変更されました。
手順1で作成したエンドポイントのサブネットを削除する。
さいごに1で作成したエンドポイントのサブネットを削除します。 一時的に作成したのサブネットのチェックを外し、[サブネットの変更]を選択します。
サブネットが削除されました。
これで、ダウンタイムが発生せずエンドポイントのサブネットを変更することができました。
マルチAZの場合
大まかな流れは以下のとおりです。
- 現時点で作成されているサブネットのどちらか一方のサブネットを片方のみ変更する。
-
変更していない方のサブネットを変更する。
完成図
ポイントは両方一気に変更しようとせず、片方ずつ変更することです。
現時点で作成されているサブネットのどちらか一方のサブネットを片方のみ変更する。
まずは、現時点で作成されているサブネットのどちらか一方のサブネットを片方のみ変更します。 [サブネットの管理]を選択し、どちらか片方のサブネットのみ変更をし、[サブネットの変更]を選択します。
サブネットが変更されました。
変更していない方のサブネットを変更する。
さいごに変更していない方のサブネットを変更します。
[サブネットの管理]を選択し、まだ変更していない方のサブネットを変更し、[サブネットの変更]を選択します。
サブネットが変更されました。
これで、ダウンタイムが発生せずエンドポイントのサブネットを変更することができました。
どちらの方法も変更中・削除中のエンドポイントに接続しに行ってしまった場合、一時的に応答が返ってこないことはありますが、Connection timed out
が発生することはありませんでした。
さいごに
今回はダウンタイムなしでインターフェイス型VPCエンドポイントのサブネットを変更する方法をお伝えしました。
サブネットを変更する機会はあまりないと思いますが、変更する場合には注意してください。
最後までお読みいただきありがとうございました!
どなたかのお役に立てれば幸いです。
以上、おつまみ(@AWS11077)でした!
参考資料
インターフェイス VPC エンドポイントを使用して AWS のサービス にアクセスする - Amazon Virtual Private Cloud
VPCエンドポイント(インターフェースエンドポイント)はVPCの中に1つあれば動作するという話 | DevelopersIO